/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja2;

/**
 *
 * @author asus
 */
public class Calculator {
    
    /**
     * Pila para el programa calculador
     */
    private VectorStack<Double> pila;
    
    /**
     * Arreglo que contiene los operandos y operadores
     */
    private String[] palabras;
      
    /**
     * Resultado de evaluar la expresión
     */
    private double result;
    
    /**
     * Constructor de la clase
     */
    public Calculator() {
        pila = new VectorStack<Double>();
    }
    
    /**
     * Procesa la expresión Postfix hasta un resultado, o devuelve excepciones si la expresión es incorrecta
     * post: Establece el resultado de evaluar la expresión, lanza expresiones si esta es incorrecta.
     * @param inp
     * @throws Exception 
     */
    public void processInput(String inp) throws Exception {
        palabras = inp.split(" ");
        validateInput();
    }
    
    /**
     * Valida la entrada del usuario y realiza el cálculo si es válida
     * post: Valida y calcula el resultado de la expresión
     * @throws Exception 
     */
    public void validateInput() throws Exception {
        for (int i = 0; i < palabras.length; i++) {
            try {
                double val = Double.parseDouble(palabras[i]);
                pila.push(val);
            } catch (Exception e) {
                if (!palabras[i].equals("+") && !palabras[i].equals("-") && !palabras[i].equals("*") && !palabras[i].equals("/")) {
                    throw new Exception("Ingreso inválido");
                }
                try {
                   evaluate(i);  
                } catch (Exception d) {
                    throw new Exception("Sintaxis inválida");
                }
            }
        }
        result = pila.pop();
    }
    
    /**
     * Evalúa el resultado numérico de una operación, utilizando la pila
     * post: Guarda en la pila el resultado al encontrar una operación
     * @param pos
     * @throws Exception 
     */
    public void evaluate(int pos) throws Exception {
        if (palabras[pos].equals("+")) {
            double op2 = pila.pop();
            double op1 = pila.pop();
            double result = op1+op2;
            pila.push(result);
            return;
        } else if (palabras[pos].equals("-")) {
            double op2 = pila.pop();
            double op1 = pila.pop();
            double result = op1-op2;
            pila.push(result);
            return;
        } else if (palabras[pos].equals("*")) {
            double op2 = pila.pop();
            double op1 = pila.pop();
            double result = op1*op2;
            pila.push(result);
            return;
        } else if (palabras[pos].equals("/")) {
            double op2 = pila.pop();
            double op1 = pila.pop();
            double result = op1/op2;
            pila.push(result);
            return;
        }
    }
    
    /**
     * Devuelve el resultado manejado por la clase
     * @return 
     */
    public double getResult() {
        return result;
    }
    
}

